package javaapplication1;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SceneController extends Thread{
    private ArrayList<Brick> bloqueList;
    private ArrayList<Ball> bolaList;
    private Bar barra;
    private Scene scene;
    private int numPixels = 3;
    private Boolean leftPulsado = false;
    private Boolean rightPulsado = false;
    private Boolean spacePulsado = false;
    private int time = 10;

    public SceneController(Scene scene){
        this.scene = scene;
        bolaList = new ArrayList<>();
        bloqueList = new ArrayList<>();
    }

    private void update() {
        if (leftPulsado && !rightPulsado) moverBarraIzquierda(barra, numPixels);
        if (rightPulsado && !leftPulsado) moverBarraDerecha(barra, numPixels);
        if (spacePulsado){
            if (bolaList.size() == 1){
                bolaList.get(0).setVelocidadX(1);
                bolaList.get(0).setVelocidadY(-2);
            }
        }
        for (Ball bola : bolaList){
            moverBola(bola);
        }
        
        //deadBall();
        
        try {
            Thread.sleep(time);
        } catch (InterruptedException ex) {
            Logger.getLogger(SceneController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void run(){
        while(!isTerminal()){
            update();
        }
    }
  
    public void setBarra(Bar barra) {
        this.barra = barra;
    }

    public void setScene(Scene scene) {
        this.scene = scene;
    }
    
    public void aniadirBola(Ball bola){
        bolaList.add(bola);
    }
    
    public void aniadirBloque(Brick b){
        bloqueList.add(b);
    }
    
    public void setLeftPulsado(Boolean leftPulsado) {
        this.leftPulsado = leftPulsado;
    }

    public void setRightPulsado(Boolean rightPulsado) {
        this.rightPulsado = rightPulsado;
    }

    public void setSpacePulsado(Boolean spacePulsado) {
        this.spacePulsado = spacePulsado;
    }
    
    public boolean isTerminal(){
        if(scene.getLevel().getBloqueList().isEmpty())    return true;
        
        if(bolaList.isEmpty())    return true;
        
        return false;
    }
    
    public void moverBola(Ball bola){
        // Colisiones con los límites del tablero
        if (bola.getPosicion().getX() + bola.getVelocidadX() >= bola.getAnchoMaximo() - (bola.getAncho() / 2) || bola.getPosicion().getX() + bola.getVelocidadX() < (bola.getAncho() / 2)) {
            bola.setVelocidadX(-1 * bola.getVelocidadX());
        }
        if (bola.getPosicion().getY() + bola.getVelocidadY() >= bola.getAltoMaximo() - (bola.getAlto() / 2) || bola.getPosicion().getY() + bola.getVelocidadY() < (bola.getAlto() / 2)) {
            bola.setVelocidadY(-1 * bola.getVelocidadY());
        }
        
        // Colisiones con la barra
        if (bola.getVelocidadY() > 0 && (barra.getCoordenadaX() <= bola.getPosicion().getX() && (barra.getCoordenadaX() + barra.getAncho() >= bola.getPosicion().getX()))
                && ( barra.getCoordenadaY() >= bola.getPosicion().getY() + bola.getAlto() - 1 && barra.getCoordenadaY() <= bola.getPosicion().getY() + bola.getAlto() + 1)){
            bola.setVelocidadY(-1 * bola.getVelocidadY());
        }

        bola.move();
    }
    
    public void moverBarraDerecha(Bar barra, int pixels){
        if (barra.getCoordenadaX() + pixels > barra.getMaximo() - barra.getAncho() - 2) barra.getCoordenada().setX(barra.getMaximo() - barra.getAncho() - 2);
        else barra.getCoordenada().setX(barra.getCoordenadaX() + pixels);
    }
    
    public void moverBarraIzquierda(Bar barra, int pixels){
        if (barra.getCoordenadaX() - pixels < 1) barra.getCoordenada().setX(1);
        else barra.getCoordenada().setX(barra.getCoordenadaX() - pixels);
    }
    
    public void deadBall(){
        int i = -1;
        for(Ball bola : bolaList){
            if(bola.getPosicion().getY() > barra.getCoordenadaY() + 10) {
                i = bolaList.indexOf(bola);
            }
        }
        if (i != -1) {
            scene.eliminar(bolaList.get(i));
            bolaList.remove(i);
        }
    }

}
